Qml学习笔记:cpp与qml的交互调用方式
如何用在cpp中调用qml的方法main.qmlmain.cpp
如何在qml中调用C++的方法函数main.cppmain.qml
如何使用qml调用按钮的信号槽(1)使用默认的clicked()信号(2)qml的按钮中直接注册信号发送到槽函数(QML中设置信号)(3)在qml中设置cpp中的信号槽函数
(4)从录入到qml的方法
如何用在cpp中调用qml的方法
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5 as Controls
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
//Qml通信cpp
Controls.Label
{
objectName: 'labelcpp'
text: 'Qml && cpp'
font.pointSize: 38
//cpp调用这个函数
function getText()
{
return text
}
//加参数后
function getText(info)
{
return text + info
}
}
}
main.cpp
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
//C++调用qml
auto root = engine.rootObjects();//拿到所有对象的列表
//找出列表中的第一个
auto labelqml = root.first()->findChild("labelcpp");//名字要与main.qml中的 objectName: 'labelcpp' 相同
QVariant ret;
//调用上述实例化的名字,main.qml中对应函数名,将返回到上述定义的ret中
QMetaObject::invokeMethod(labelqml, "getText",Q_RETURN_ARG(QVariant, ret));
//如果有参数要传入调用宏Q_ARG(QVariant,"参数")
QMetaObject::invokeMethod(labelqml, "getText",Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, " jie"));
qDebug() |